package 链表.升序列表;
/**
 * 题目描述
 * 将两个升序链表合并为一个新的 升序 链表并返回。
 * 新链表是通过拼接给定的两个链表的所有节点组成的。
 * 输入：l1 = [1,2,4], l2 = [1,3,4]
 * 输出：[1,1,2,3,4,4]
 * 力扣：https://leetcode-cn.com/problems/merge-two-sorted-lists/
 * 力扣第21题
 * */
/**
 * 解题思路：
 * 因为是升序的
 * 比较开始节点的值
 * 将较小的值加入新链表里面
 * 初始状态:
 * prehead -> null
 * prev -> prehead
 *
 * 经过循环操作后:
 * prehead -> node1 -> node2 -> node3 -> ...
 *            ^
 *          这里才是真正结果链表的开始
 * */

class Solution {
    public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
        // 创建一个假结点
        ListNode prehead = new ListNode();
        // 使用prev指针构造新链表
        ListNode prev = prehead;
        // 循环比较两个链表
        while(list1 != null && list2 != null){
            if(list1.val <= list2.val){
                prev.next = list1;
                list1 = list1.next;
            }else{
                prev.next = list2;
                list2 = list2.next;
            }
            prev = prev.next;
        }
        // 循环结束后，将剩余的链表加入新链表
        prev.next = list1 == null ? list2 : list1;
        return prehead.next;
    }
}